package pe.edu.upc.dsd.epica.serviceimp;

import java.util.List;
import javax.jws.WebService;
import javax.xml.soap.SOAPException;

import org.apache.log4j.Logger;

import pe.edu.upc.dsd.epica.dao.PromocionDao;
import pe.edu.upc.dsd.epica.dao.PromocionxUsuarioDao;
import pe.edu.upc.dsd.epica.dao.UsuarioDao;
import pe.edu.upc.dsd.epica.model.Promocion;
import pe.edu.upc.dsd.epica.model.PromocionxUsuario;
import pe.edu.upc.dsd.epica.model.Usuario;
import pe.edu.upc.dsd.epica.service.PromocionxUsuarioService;

@WebService (endpointInterface = "pe.edu.upc.dsd.epica.service.PromocionxUsuarioService")
public class PromocionxUsuarioServiceImpl implements PromocionxUsuarioService {
		
    PromocionxUsuarioDao promocionxusuarioDao;
    PromocionDao promocionDao;
    UsuarioDao usuarioDao;
    private final static Logger logger = Logger.getLogger(PromocionxUsuarioServiceImpl.class);

	public void setPromocionDao(PromocionDao promocionDao) {
		this.promocionDao = promocionDao;
	}

	public void setUsuarioDao(UsuarioDao usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	public void setPromocionxusuarioDao(PromocionxUsuarioDao promocionxusuarioDao) {
		this.promocionxusuarioDao = promocionxusuarioDao;
	}

	//Criterio de aceptacion
	@Override
	public PromocionxUsuario addVisita(PromocionxUsuario usuarioPromocion) throws SOAPException {
		ValidatePromocionUsuario(usuarioPromocion);
		
		if (usuarioPromocion.getPromocion().getCodigo() == null || 
				usuarioPromocion.getUsuario().getLogin() == null || 
				usuarioPromocion.getUsuario().getTipo() == null) 
		{
			throw new IllegalArgumentException("No debe ingresar valores nulos.");
		}
		
		Promocion promocion=promocionDao.findByPromocionCode(usuarioPromocion.getPromocion().getCodigo());	
		
		Usuario usuario=null;
		
		try {
			usuario=usuarioDao.finByLoginTipo(usuarioPromocion.getUsuario().getLogin(),
					usuarioPromocion.getUsuario().getTipo());
		} catch (Exception e) {
			throw new IllegalArgumentException("El login no existe.");
		}
						
		if(usuario == null || promocion == null)
		{
			throw new IllegalArgumentException("El login o el codigo de promocion no existe.");
		}
		
		usuarioPromocion.getUsuario().setCodigo(usuario.getCodigo());
		
		PromocionxUsuario promUsuarioReg = null;
		
		try {
			promUsuarioReg = promocionxusuarioDao.findByUsuarioPromocion(usuarioPromocion);
		} catch (Exception e) {
			logger.warn("Titulo:\nAgregar visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
		}
		
		boolean obtienePremio=false;
		if(promUsuarioReg!= null)//Actualiza
		{
			if(promUsuarioReg.getNumVisitas() + 1 == promocion.getNumVisitas())
			{
				obtienePremio=true;
				usuarioPromocion.setNumVisitas(0);
			}
			else
			{
				usuarioPromocion.setNumVisitas(promUsuarioReg.getNumVisitas() + 1);
			}
			
			try {
				promocionxusuarioDao.update(usuarioPromocion);
			} catch (Exception e) {
				logger.error("Titulo:\nAgregar visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
				throw new SOAPException("Error al actualizar la visita.");
			}			
		}
		else//Registra
		{
			if(promocion.getNumVisitas() == 1)
			{
				obtienePremio=true;
				usuarioPromocion.setNumVisitas(0);
			}
			else
			{
				usuarioPromocion.setNumVisitas(1);
			}
					
			try {
				promocionxusuarioDao.save(usuarioPromocion);
			} catch (Exception e) {
				logger.error("Titulo:\nAgregar visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
				throw new SOAPException("Error al registrar la visita.");
			}
			
		}			
		
		usuarioPromocion.setObtienePremio(obtienePremio);
		
		usuarioPromocion.setPromocion(promocion);
		usuarioPromocion.setUsuario(usuario);
		
		return usuarioPromocion;
	}

	@Override
	public List<PromocionxUsuario> findByUsuarioCode(String codUsuario) throws SOAPException {
		try {
			return promocionxusuarioDao.findByUsuarioCode(codUsuario);
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar la visita.");
		}
		
	}

	private void ValidatePromocionUsuario(PromocionxUsuario promoUsu)
	{
		if(promoUsu == null)
		{
			throw new IllegalArgumentException("El objeto promocion por usuario no puede ser nulo.");
		}
	}

	@Override
	public PromocionxUsuario findByUsuarioPromocion(PromocionxUsuario usuarioPromocion) throws SOAPException {
		try {
			return promocionxusuarioDao.findByUsuarioPromocion(usuarioPromocion);
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar la visita.");
		}
		
	}

	@Override
	public void deletePromocion(PromocionxUsuario usuarioPromocion) throws SOAPException {
		try {
			promocionxusuarioDao.delete(usuarioPromocion);
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar la visita.");
		}
		
	}

}
